package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"github.com/go-playground/validator/v10"
)

type PostParams struct {
	Name string `json:"name" uri:"name" form:"name" binding:"required"`
	Age  int    `json:"age" uri:"age" form:"age" binding:"required,vaitiaAge"`
	Sex  bool   `json:"sex" uri:"sex" form:"sex"`
}

func vaitiaAge(fl validator.FieldLevel) bool {
	// 反射类型断言
	if fl.Field().Interface().(int) > 39 {
		return false
	}
	return true
}

func demo3() {
	r := gin.Default()

	// 添加自定义校验
	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		v.RegisterValidation("vaitiaAge", vaitiaAge)
	}

	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{"name": "ddd"})
	})

	/*
		// 获取 参数 json
		r.POST("/test", func(c *gin.Context) {
			var p PostParams
			err := c.ShouldBindJSON(&p)
			if err != nil {
				c.JSON(200, gin.H{"error": err.Error()})
				return
			}
			c.JSON(200, gin.H{
				"msg":  "222",
				"data": p,
			})
		})

	*/

	/*
		// 获取 参数 uri
		r.POST("/test/:name/:age/:sex", func(c *gin.Context) {
			var p PostParams
			err := c.ShouldBindUri(&p)
			if err != nil {
				c.JSON(200, gin.H{"error": err.Error()})
				return
			}
			c.JSON(200, gin.H{
				"msg":  "222",
				"data": p,
			})
		})
	*/

	/*
		// 获取 参数 ?name=
		r.POST("/test", func(c *gin.Context) {
			var p PostParams
			err := c.ShouldBindQuery(&p)
			if err != nil {
				c.JSON(200, gin.H{"error": err.Error()})
				return
			}
			c.JSON(200, gin.H{
				"msg":  "222",
				"data": p,
			})
		})
	*/

	// 校验
	r.POST("/test", func(c *gin.Context) {
		var p PostParams
		err := c.ShouldBindQuery(&p)
		if err != nil {
			fmt.Println(err)
			c.JSON(200, gin.H{"error": "验证错误"})
			return
		}
		c.JSON(200, gin.H{
			"msg":  "222",
			"data": p,
		})
	})
	//r.POST()

	r.Run(":8080")
}
